<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>
<script>
    // 单行注释

    /*
        块注释
    */

    /*
    * 文档注释
    *
    *
    * */

    //设 x = 5  设 y =20
    //变量： 是一个容器,在程序运行期间值可以不断变化
    //变量名的命名规范
    // 1. 由数字,字母,下划线,$组成
    // 2. 数字不能开头
    // 3. 不能和系统的关键字,保留字相同
    // 4. 见名知意
    // 5. 采用驼峰命名法,appleCount,boxRedDiv
    //小驼峰：peopleOfChina   大驼峰:NameOfWaiGe

    var a = 5;
    var b = 20;
    var c = a + b ;

    //声明一个变量
    var d;

    //控制台输出内容
    console.log(c);

    //command +a全选 command+c 复制 command+v粘贴  command+z撤销command+shift+z反撤销

    c = a * b;
    console.log(c);


    c = a / b;
    console.log(c);

    //按照操作数的不同,运算符可以分为 单目运算（一元运算符） 双目运算（二元运算符）三目运算符（三元运算符）
    c = a % b;
    console.log(c);


    // js中常见的数据类型
    // 1 number 数值类型 6, 7.8
    // 2 string 字符串类型, 用单引号或双引号引起来的内容' I love money',"All money come to my home "
    var e ='good good study, day day up';
    console.log(e);

    var f ="夏天能穿多少穿多少，冬天能穿多少穿多少";
    console.log(f);


    // 单引号不能嵌套单引号 双引号不能嵌套双引号 除非在嵌套的引号前方加入\（转义字符），来改变字符原先的意义
    var g ="子曰：\"滚蛋,扯犊子,老子没说过\"";
    console.log(g);


    // 通过 + 运算符可以连接字符串
    var h ='I love' +'you'+'!';
    console.log(h);


    // 数字和字符串相加会把数字转换成字符串然后再做运算（简单来说按照顺序计算）
    h = 1 + 1 ;
    console.log(h);//2

    h = 1 + "1";
    console.log(h);//11

    h = "1" + "1" ;
    console.log(h);//11

    h =1 + 1 + "1" ;
    console.log(h);//21

    h =1 + "1" + 1 ;
    console.log(h);//111


    // 减乘除则会按照把字符串转换为数字然后进行计算
    h ='1'-0;
    console.log(h);


    // 通过typeof可以查看数据的类型
    console.log(typeof h);


    h = 1 + '2' + ( 3 + 4 ) +'5';
    console.log(h);


    // NaN:no a number 不是数字的数字类型
    h = "1"*"1a";
    console.log(h);
    console.log(typeof h);


    //3. undefined没有被定义的类型
    console.log(d);
    console.log(typeof d);

    //4.  boolean : 布尔类型   只有两个值 true , false
    console.log(typeof true);
    console.log(typeof false);


    // 比价运算符
    // > , < , >= , <= , == ,!= , === , !==
    var r = 5 > 3;
    console.log(r);

    r = 5 == 3;
    console.log(r);

    // == 和 != 不比较类型
    // 运算符会把不同类型的转化为同类型的进行比较
    r = 1 == "1";
    console.log(r);

    // === 和 !== 先比较类型是否相同然后比较是否相同
    r = 1 === "1";
    console.log(r);

    // tips：比较运算都会返回一个boolean类型的值

    // NaN是唯一一个和自身不相等的值, 可以用该特性判断值是不是NaN
    r = NaN == NaN;
    console.log(r);

    // 5.object 对象类型
    var arr =[ 1 , 2 , 3 ];
    console.log(typeof  arr);

    // 6. null 空类型也是object
    console.log(typeof null);

    // 复合赋值运算符   +=  -=  *=  /=  %=
    a = 5 ;
    a += 2 ;   // => a = a + 2
    console.log(" a = " + a );

    a *= 2;
    console.log(" a = " + a );

    a %= 5;
    console.log(" a = " + a );


    // 表达式: 由常量 变量 运算符 组成
    // 语句以;结尾
    // 只有;为空语句


    // 自增,自减运算符  ++ , --
    var x =5;
    // 自增1
    x++;
    console.log(x);

    ++x;
    console.log(x);

    // 自减1
    x--;
    console.log(x);

    --x;
    console.log(x);


    // 自增（自减)运算符在前取新值，在后取旧值
    var y = x++ + ++x + x--;
    console.log(y);
    console.log(x);

    var  n = 3;
    console.log(++n);
    // 左结合性原则
    // y = -x-- - x++ + x++;
    y=- x-- - x++ + x++;
    console.log(y);//-5
    console.log(x);//7


    y=x++ + y++ + ++x; // 打这种类型时系统最多识别3个+如果要超过则用空格或者括号隔开
    console.log(y);
    console.log(x);

    x = 5;
    // 逻辑运算符
    // 逻辑或||   两边同时为假才为假（一真即真）
    y = x++ > 3 || x-- < 8;//(true,6)
    // y = x++ > 5 || x-- < 8;(true,5)
    console.log(y,x);

    x = 5;
    // 逻辑运算符
    // 逻辑且&&   两边同时为真才为真（一假即假）
    // y = x++ >3 && x-- < 8;(true,5)
    y = x++ >5 && x-- < 8;//(false,6)
    console.log(y,x);


    // 逻辑运算符的短路现象
    // || 左边表达式如果为真，右边的代码不会再被执行
    // && 左边表达式如果为假，右边的代码不会再被执行

    console.log(!true);// false
    console.log(!false);// true


    // js中非零即为真
    // 零 包括 false 0 '' undefined NaN null
    r = 5 || 6;
    console.log(r);

    r = undefined || 'hello, world ';
    console.log(r);

    r = "hello" && "world";
    console.log(r);

    r = 0||false;
    console.log(r);

    a = 5;
    b = 10;
    //三元运算符
    r = a >b ? a: b;
    //如果 ？左边条件表达式为真，表达式返回 ：左边的值，否则返回 ：右边的值
    console.log(r);

</script>